/*************************************************************************
    > File Name    : PageLibPreprocessor.h
    > Author       : LiuLei
    > Mail         : 2261459486@qq.com 
    > Created Time : 2022年11月29日 星期二 16时14分03秒
 ************************************************************************/

#ifndef __LL_PAGELIBPREPROCESSOR_H__
#define __LL_PAGELIBPREPROCESSOR_H__

// 网页库预处理类

#include "WordSegmentation.h"
#include "WebPage.h"
#include <list>
#include <unordered_map>
using std::list;
using std::unordered_map;
using std::pair;


class PageLibPreprocessor 
{
public:
    PageLibPreprocessor(Configuration &conf);
    ~PageLibPreprocessor();

    void doProcess();

private:
    void readInfoFromFile();                // 根据配置信息读取网页库和偏移库的内容
    void cutRedundantPages();               // 对冗余的网页进行去重
    void buildInvertIndexTable();           // 创建倒排索引表
    void storeOnDisk();                     // 写回磁盘

private:
    WordSegmentation                                 _jieba;             // 分词对象
    list<WebPage>                                    _pageLib;           // 网页库容器对象
    // 网页库不使用vector的原因是
    // 1. 需要考虑扩容，比较麻烦
    // 2. 当删除冗余信息时，会用到erase函数，而vector的erase函数会调用WebPage的拷贝构造函数
    unordered_map<int, pair<int, int>>               _offsetLib;         // 网页库偏移对象
    unordered_map<string, vector<pair<int, double>>> _invertIndexTable;  // 倒排索引表对象 
    unordered_map<string, string>                    _config;            // 配置文件信息
};

#endif
